import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from scipy.interpolate import griddata

sns.set(style="white", font_scale=1.5)
plt.rcParams['font.sans-serif'] = "Simsun"

# 读取Excel文件中所有工作表的数据
excel_file = 'D:\\文档\\DLMU\\实验结果.xlsx'
xls = pd.ExcelFile(excel_file)
dfs = []

# 遍历所有工作表，读取数据并合并
for sheet in xls.sheet_names:
    df = pd.read_excel(excel_file, sheet_name=sheet)
    dfs.append(df)

# 将所有工作表的数据合并为一个DataFrame
data = pd.concat(dfs)

# 计算每组参数组合的目标函数平均值
grouped = data.groupby(['狮群', '迭代', '步长因子'], as_index=False)['目标函数'].mean()

# 创建透视表用于绘制热图
pivot_table = grouped.pivot_table(index='狮群', columns='迭代', values='目标函数', aggfunc='mean')

# 绘制热图
plt.figure(figsize=(12, 8))

# 创建从 (20, 20) 开始的狮群和迭代网格
狮群_vals = np.arange(grouped['狮群'].min(), grouped['狮群'].max() + 1, 10)
迭代_vals = np.arange(grouped['狮群'].min(), grouped['迭代'].max() + 1, 10)
狮群_grid, 迭代_grid = np.meshgrid(狮群_vals, 迭代_vals)

# 对数据进行插值，生成更密集的网格
Z_smooth = griddata((grouped['狮群'], grouped['迭代']), grouped['目标函数'], (狮群_grid, 迭代_grid), method='cubic')

# 使用内置渐变色从深红色到淡黄色
custom_cmap = sns.color_palette("YlGnBu", as_cmap=True)

# 绘制插值后的平滑热图
sns.heatmap(Z_smooth, cmap=custom_cmap, xticklabels=狮群_vals, yticklabels=迭代_vals, annot=True, fmt=".0f")


# 反转 y 轴以使 20 在顶点
plt.gca().invert_yaxis()

plt.title('种群数量与迭代次数对目标函数的影响')
plt.xlabel('种群数量', labelpad=20)
plt.ylabel('迭代次数', labelpad=20)

plt.show()
